package com.are.manejadores;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import com.are.entidades.Noticia;
import com.are.odisea.db;

public class ManejadorNoticias {
	private db conexion = null;
	private Noticia noticia;
	public db getConexion() {
		return conexion;
	}
	public void setConexion(db conexion) {
		this.conexion = conexion;
	}
	public Noticia getNoticia() {
		return noticia;
	}
	public void setNoticia(Noticia noticia) {
		this.noticia = noticia;
	}
	public ManejadorNoticias(db conexion, Noticia noticia) {
		super();
		this.conexion = conexion;
		this.noticia = noticia;
	}
	public ManejadorNoticias(db conexion) {
		super();
		this.conexion = conexion;
	}
	
	
	public boolean add(Noticia noticia) throws SQLException{
		boolean result = false;

			String sql = "insert into noticias (titulo,cuerpo,fec_pub,fec_fin,usuario,categoria,estado) values (?,?,?,?,?,?,?)";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1, noticia.getTitulo());
			pst.setString(2, noticia.getCuerpo());
			pst.setString(3, noticia.getFec_pub());
			pst.setString(4, noticia.getFec_fin());
			pst.setString(5, noticia.getUsuario());
			pst.setString(6, noticia.getCategoria());
			pst.setString(7, noticia.getEstado());
			if (conexion.Update(pst) > 0) {
				conexion.Commit();
				result = true;
			}
		return result;
	}
	
	public boolean update(Noticia noticia) throws SQLException{
		boolean result = false;

			String sql = "update noticias set titulo= ?, cuerpo=?,fec_pub=?,fec_fin=?, usuario=?, categoria=?, estado=? where id=?";
			
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1, noticia.getTitulo());
			pst.setString(2, noticia.getCuerpo());
			pst.setString(3, noticia.getFec_pub());
			pst.setString(4, noticia.getFec_fin());
			pst.setString(5, noticia.getUsuario());
			pst.setString(6, noticia.getCategoria());
			pst.setString(7, noticia.getEstado());
			pst.setString(8, noticia.getId());
			
			if (conexion.Update(pst) > 0) {
				conexion.Commit();
				result = true;
			}
			
		return result;
	}
	
	public boolean remove(String key) throws SQLException {
		boolean result = false;

			String sql = "delete from noticias where id=?";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1,key);
			if (conexion.Update(pst) > 0) {
				conexion.Commit();
				result = true;
			}
		return result;	
	}
	public boolean exist(String key) throws SQLException {
		boolean result = false;

			String sql = "select id from noticias where id = ?";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1,key);
			ResultSet rs = conexion.Query(pst);
			if (rs.next()) {
				result = true;
			}
			rs.close();
			
		
		return result;	
	}
	
	public boolean Find(String key) throws SQLException {
		boolean result = false;

			String sql = "select * from vnoticias where id=?";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1,key);
			ResultSet rs = conexion.Query(pst);
			if (rs.next()) {
				noticia = new Noticia();
				noticia.setTitulo(rs.getString("titulo"));
				noticia.setCuerpo(rs.getString("cuerpo"));
				noticia.setFec_pub(rs.getString("fec_pub"));
				noticia.setFec_fin(rs.getString("fec_fin"));
				noticia.setUsuario(rs.getString("usuario"));
				noticia.setCategoria(rs.getString("categoria"));
				noticia.setEstado(rs.getString("estado"));
				noticia.setNomcategoria(rs.getString("nomcat"));
				noticia.setNomusuario(rs.getString("nomusuario"));
				noticia.setId(rs.getString("id"));
				result = true;
			}
			rs.close();
		return result;	
	}
	
	public ArrayList<Noticia> listByCategoria(int categoria) throws SQLException {
		ArrayList<Noticia> lista = new ArrayList<Noticia>();
		
			String sql = "select * from vnoticias where categoria = ? order by id";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setInt(1,categoria);
			ResultSet rs  = conexion.Query(pst);
			while(rs.next()) {
				Noticia noticia = new Noticia();
				noticia.setTitulo(rs.getString("titulo"));
				noticia.setCuerpo(rs.getString("cuerpo"));
				noticia.setFec_pub(rs.getString("fec_pub"));
				noticia.setFec_fin(rs.getString("fec_fin"));
				noticia.setUsuario(rs.getString("usuario"));
				noticia.setCategoria(rs.getString("categoria"));
				noticia.setEstado(rs.getString("estado"));
				noticia.setId(rs.getString("id"));
				noticia.setNomcategoria(rs.getString("nomcat"));
				noticia.setNomusuario(rs.getString("nomusuario"));
				lista.add(noticia);
			}
			rs.close();
		return lista;
	}
	
	public boolean AddPermisoRol(String idNoticia, String idRol) throws SQLException {
		boolean result = false;
		String sql = "insert into rol_noticia (ID_NOT,ROL) values (?,?)";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, idNoticia);
		pst.setString(2, idRol);
		if (conexion.Update(pst) > 0) {
			conexion.Commit();
			result = true;
		}
		
		return result;
	}

	public boolean RemovePermisoRol(String idNoticia, String idRol) throws SQLException {
		boolean result = false;
		String sql = "delete from rol_noticia where ID_NOT=? and ROL=?";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, idNoticia);
		pst.setString(2, idRol);
		if (conexion.Update(pst) > 0) {
			conexion.Commit();
			result = true;
		}
		
		return result;
	}

	
	public boolean AddPermisoUsuario(String idNoticia, String idUsuario) throws SQLException {
		boolean result = false;
		String sql = "insert into permisos_noticias (NOTICIAS_ID,USUARIOS_ID) values (?,?)";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, idNoticia);
		pst.setString(2, idUsuario);
		if (conexion.Update(pst) > 0) {
			conexion.Commit();
			result = true;
		}
		
		return result;
	}
	
	public boolean RemovePermisoUsuario(String idNoticia, String idUsuario) throws SQLException {
		boolean result = false;
		String sql = "delete from permisos_noticias where NOTICIAS_ID=? and USUARIOS_ID=?";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1, idNoticia);
		pst.setString(2, idUsuario);
		if (conexion.Update(pst) > 0) {
			conexion.Commit();
			result = true;
		}
		
		return result;
	}
	
	public ArrayList<Noticia> listByUsuario(String usuario,int categoria,String rol) throws SQLException {
		ArrayList<Noticia> lista = new ArrayList<Noticia>();
		
		String sql = "SELECT * FROM vnoticias NOTI " +
				" WHERE categoria = ? and (NOTI.ID = (SELECT NOTICIAS_ID FROM PERMISOS_NOTICIAS WHERE USUARIOS_ID = ? AND NOTICIAS_ID=NOTI.ID) " +
				"|| NOTI.ID =  (SELECT ID_NOT FROM ROL_NOTICIA WHERE ROL = ? AND ID_NOT = NOTI.ID)) order by FEC_PUB";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setInt(1,categoria);
			pst.setString(2,usuario);
			pst.setString(3,rol);
			ResultSet rs  = conexion.Query(pst);
			while(rs.next()) {
				Noticia noticia = new Noticia();
				noticia.setTitulo(rs.getString("titulo"));
				noticia.setCuerpo(rs.getString("cuerpo"));
				noticia.setFec_pub(rs.getString("fec_pub"));
				noticia.setFec_fin(rs.getString("fec_fin"));
				noticia.setUsuario(rs.getString("usuario"));
				noticia.setCategoria(rs.getString("categoria"));
				noticia.setEstado(rs.getString("estado"));
				noticia.setId(rs.getString("id"));
				noticia.setNomcategoria(rs.getString("nomcat"));
				noticia.setNomusuario(rs.getString("nomusuario"));
				lista.add(noticia);
			}
			rs.close();
		return lista;
	}
	
	public ArrayList<Noticia> listRecientes(String usuario,String rol) throws SQLException {
		ArrayList<Noticia> lista = new ArrayList<Noticia>();
		
		String sql = "SELECT * FROM vnoticias NOTI " +
				" WHERE  (NOTI.ID = (SELECT NOTICIAS_ID FROM PERMISOS_NOTICIAS WHERE USUARIOS_ID = ? AND NOTICIAS_ID=NOTI.ID) " +
				"|| NOTI.ID =  (SELECT ID_NOT FROM ROL_NOTICIA WHERE ROL = ? AND ID_NOT = NOTI.ID)) order by FEC_PUB";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1,usuario);
			pst.setString(2,rol);
			ResultSet rs  = conexion.Query(pst);
			while(rs.next()) {
				Noticia noticia = new Noticia();
				noticia.setTitulo(rs.getString("titulo"));
				noticia.setCuerpo(rs.getString("cuerpo"));
				noticia.setFec_pub(rs.getString("fec_pub"));
				noticia.setFec_fin(rs.getString("fec_fin"));
				noticia.setUsuario(rs.getString("usuario"));
				noticia.setCategoria(rs.getString("categoria"));
				noticia.setEstado(rs.getString("estado"));
				noticia.setId(rs.getString("id"));
				noticia.setNomcategoria(rs.getString("nomcat"));
				noticia.setNomusuario(rs.getString("nomusuario"));
				lista.add(noticia);
			}
			rs.close();
		return lista;
	}
	
}
